# !/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
===========================
@Time : 2022/8/26 0026 23:02
@Author : 测试开发工程师
@File : 13. sql_model_demo.py
@Software: PyCharm
============================
"""
import yaml
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import *
# 导入 Query 以便于调用的时候代码提示
from sqlalchemy.orm import Query

app = Flask(__name__)

with open("./data.yaml") as f:
    result = yaml.safe_load(f)
    username = result.get('database').get('username')
    password = result.get('database').get('password')
    server = result.get('database').get('server')
    db = result.get('database').get('db')

app.config['SQLALCHEMY_DATABASE_URI'] = f'mysql+pymysql://{username}:{password}@{server}/{db}?charset=utf8'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
# SQLAlchemy 绑定 app
db = SQLAlchemy(app)


# 定义数据库的表，需要继承 db.Model
class User(db.Model):
    # 设置数据库表名
    __tablename__ = "user"
    # 每一个类变量表示一个数据库表的列名
    # 第一个参数是表示数据的类型， primary_key=True 表示是主键
    id = Column(Integer, primary_key=True)
    # unique = True 表示是不能重复的， nullable=False 表示不可以为空
    username = Column(String(80), unique=False, nullable=False)
    email = Column(String(120), unique=True, nullable=False)
    gender = Column(String(3), unique=False)

    # 魔法函数  方便打印
    def __repr__(self):
        return f"<User{self.username},{self.gender},{self.email}>"


if __name__ == '__main__':

    # 新增表数据，需要导入 User 类，进行实例化
    user1 = User(id=1, username="hogwarts", email='123@123.com', gender='男')
    # 将数据提交到 session
    db.session.add(user1)
    # 将数据提交到 commit
    db.session.commit()
    # 关闭 session
    db.session.close()

    # 读取全部数据
    res = User.query.all()
    # 遍历数据，得到想要的字段
    for rs in res:
        print(rs.username, rs.email)

    # 单条数据查询
    res0 = User.query.filter_by(gender='男').first()
    print(res)

    # 多条数据查询
    res1 = User.query.filter_by(gender='男').all()

    # 单条数据查询
    res2 = User.query.filter_by(gender='男').filter_by(username='马力').filter_by(email='aaa').first()

    # 多条数据查询，没有数据返回 NULL
    res3 = User.query.filter_by(gender='男').filter_by(username='马力').filter_by(email='aaa').all()

    # 修改数据
    res4 = User.query.filter_by(id=2).update({'gender': '男'})
    # 提交
    db.session.commit()
    # 关闭
    db.session.close()

    # 删除数据
    User.query.filter_by(id=2).delete()
    # 提交
    db.session.commit()
    # 关闭
    db.session.close()
